# -*- coding: utf-8 -*-

"""
1. 创建一个空栈，用来存储尚未找到的左括号；
2. 遍历字符串，遇到左括号则压栈，遇到右括号则出栈一个左括号进行匹配；
3. 在第二步骤过程中，如果空栈情况下遇到右括号，说明缺少左括号，不匹配；
4. 在第二步骤遍历结束时，栈不为空，说明缺少右括号，不匹配；
"""

LEFT = {'(', '[', '{'}
RIGHT = {')', ']', '}'}


def match(expr):
    stack = []
    for bracket in expr:
        if bracket in LEFT:
            stack.append(bracket)
        elif bracket in RIGHT:
            if not stack or not (1 <= ord(bracket) - ord(stack[-1]) <= 2):
                # ord('(') = 41
                # ord(')') = 42
                # ord('[') = 91
                # ord(']') = 93
                # ord('{') = 123
                # ord('}') = 125
                return False
            stack.pop()
    return not stack


result = match('[(){()}]')
print(result)

